package com.mycompany.myapp.aop.logging.aop.test;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * Create by wys on 2018/8/1
 * aop执行顺序: https://www.cnblogs.com/bigben0123/p/7779357.html
 * spring aop就是一个同心圆，要执行的方法为圆心，最外层的order最小。
 * 从最外层按照AOP1、AOP2的顺序依次执行doAround方法，doBefore方法。
 * 然后执行method方法，最后按照AOP2、AOP1的顺序依次执行doAfter、doAfterReturn方法。
 * 也就是说对多个AOP来说，先before的，一定后after。
 */

@Aspect
@Component
public class AopTestTwo {

    @Pointcut("execution(* com.mycompany.myapp.web.rest.aoptestcontroller..AOPTestOneController.*(..))")
    public void executeService() {

    }

    @Before("executeService()")
    public void deBefore(JoinPoint joinPoint) {
        System.out.printf("--aop=before");
        System.out.printf("=[two");


        Signature signature = joinPoint.getSignature();

        //代理的是哪一个方法
        System.out.println("[-"+signature.getName() +"-]");


        //AOP代理类的名字
        System.out.println("[-"+signature.getDeclaringTypeName() +"-]");

        System.out.println("=two]");
    }

    @After("executeService()")
    public void deAfter() {
        System.out.println("--aop=after");
        System.out.println("=two ");
    }

    @Around("executeService()")
    public Object arround(ProceedingJoinPoint pjp) {

        try {

            System.out.println("two方法环绕start.....");
            Object o =  pjp.proceed();
            System.out.println("two方法环绕proceed，结果是 :" + o);
            return o;
        } catch (Throwable e) {
            e.printStackTrace();
            return null;
        }
    }

}
